package flare.physics
{
  /**
   * Represents a Spring in a physics simulation. A spring connects two
   * particles and is defined by the springs rest length, spring tension,
   * and damping (friction) co-efficient.
   */
  public class Spring
  {
    /** The first particle attached to the spring. */
    public var p1:Particle;
    /** The second particle attached to the spring. */
    public var p2:Particle;
    /** The rest length of the spring. */
    public var restLength:Number;
    /** The tension of the spring. */
    public var tension:Number;
    /** The damping (friction) co-efficient of the spring. */
    public var damping:Number;
    /** Flag indicating that the spring is scheduled for removal. */
    public var die:Boolean;
    /** Tag property for storing an arbitrary value. */
    public var tag:uint;

    /**
     * Creates a new Spring with given parameters.
     * @param p1 the first particle attached to the spring
     * @param p2 the second particle attached to the spring
     * @param restLength the rest length of the spring
     * @param tension the tension of the spring
     * @param damping the damping (friction) co-efficient of the spring
     */
    public function Spring(p1:Particle, p2:Particle, restLength:Number = 10, tension:Number = 0.1, damping:Number = 0.1)
    {
      init(p1, p2, restLength, tension, damping);
    }

    /**
     * Initializes an existing spring instance.
     * @param p1 the first particle attached to the spring
     * @param p2 the second particle attached to the spring
     * @param restLength the rest length of the spring
     * @param tension the tension of the spring
     * @param damping the damping (friction) co-efficient of the spring
     */
    public function init(p1:Particle, p2:Particle, restLength:Number = 10, tension:Number = 0.1,
      damping:Number = 0.1):void
    {
      this.p1 = p1;
      this.p2 = p2;
      this.restLength = restLength;
      this.tension = tension;
      this.damping = damping;
      this.die = false;
      this.tag = 0;
    }

    /**
     * "Kills" this spring, scheduling it for removal in the next
     * simulation cycle.
     */
    public function kill():void
    {
      this.die = true;
    }
  } // end of class Spring
}